package optymalizacjaSkladowania;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import skladowisko.Miejsce;
import skladowisko.Pole;
import skladowisko.Warstwa;
import skladowisko.transport.Transport;

/**
 *
 * @author kedziers
 */
public class PropozycjaPrzydzialow
{

    private Transport transport;
    private List<Przydzial> przydzialy = new ArrayList<Przydzial>();
    private Pole sciezkaSkladowania = null;

    //**************************************************************************
    public PropozycjaPrzydzialow(Transport transport)
    {
        this.transport = transport;
    }
    //**************************************************************************

    public boolean addPrzydzial(Przydzial nowy)
    {
        // TODO - sprawdzenie poprawnosci przydzialu
        przydzialy.add(nowy);
        return true;
    }
    //**************************************************************************

    public boolean czyWszystkoPrzydzielone(Transport transport)
    {
        //TODO
        return false;
    }
    //**************************************************************************

    public boolean czyPolePrzydzielono(Pole pole)
    {
        for (Przydzial p : przydzialy)
        {
            if (p.getMiejsce() instanceof Warstwa)
            {
                Warstwa w = (Warstwa) p.getMiejsce();
                if (w.getPole() == pole)
                {
                    return true;
                }
            }
        }

        return false;
    }

    //**************************************************************************
    public boolean czyMiejsceZajete(Miejsce miejsce)
    {
        for (Przydzial p : przydzialy)
        {
            if (p.getMiejsce() == miejsce)
            {
                return true;
            }
        }

        return false;
    }

    public Transport getTransport()
    {
        return this.transport;
    }

    public List<Przydzial> getPrzydzialy()
    {
        return this.przydzialy;
    }

    /**
     * @return the sciezkaSkladowania
     */
    public Pole getSciezkaSkladowania()
    {
        return sciezkaSkladowania;
    }

    /**
     * @param sciezkaSkladowania the sciezkaSkladowania to set
     */
    public void setSciezkaSkladowania(Pole sciezkaSkladowania)
    {
        this.sciezkaSkladowania = sciezkaSkladowania;
    }

    //**************************************************************************
    public void sortujGrupe()
    {
        Collections.sort(przydzialy, new KomparatorGrupy());
    }
    //**************************************************************************

    private class KomparatorGrupy implements Comparator<Przydzial>
    {

        public int compare(Przydzial opt1, Przydzial opt2)
        {
            Warstwa w1 = (Warstwa) opt1.getMiejsce();
            Warstwa w2 = (Warstwa) opt2.getMiejsce();

            if (sciezkaSkladowania.getY() == 1)
            {
                if (w1.getPole().getY() > w2.getPole().getY())
                {
                    return -1;
                }
                if (w1.getPole().getY() < w2.getPole().getY())
                {
                    return 1;
                }
            } else
            {
                if (w1.getPole().getY() > w2.getPole().getY())
                {
                    return 1;
                }
                if (w1.getPole().getY() < w2.getPole().getY())
                {
                    return -1;
                }
            }
            return 0;
        }
    }
}
